namespace CSW.Framework.Common
{
    /// <summary>
    /// Asynchronous process delegate.
    /// </summary>
    /// <param name="helper">The async process helper.</param>
    /// <param name="arg1">The first method argument.</param>
    /// <param name="arg2">The second method argument.</param>
    /// <param name="arg3">The third method argument.</param>
    /// <param name="arg4">The fourth method argument.</param>
    /// <typeparam name="TResult">The result object type.</typeparam>
    /// <typeparam name="T1">The first argument type.</typeparam>
    /// <typeparam name="T2">The second argument type.</typeparam>
    /// <typeparam name="T3">The third argument type.</typeparam>
    /// <typeparam name="T4">The fourth argument type.</typeparam>
    public delegate TResult AsyncProcessDelegate<T1, T2, T3, T4, TResult>(AsyncProcessHelper helper, T1 arg1, T2 arg2, T3 arg3, T4 arg4);

    /// <summary>
    /// Asynchronous process delegate.
    /// </summary>
    /// <param name="helper">The async process helper.</param>
    /// <param name="arg1">The first method argument.</param>
    /// <param name="arg2">The second method argument.</param>
    /// <param name="arg3">The third method argument.</param>
    /// <typeparam name="TResult">The result object type.</typeparam>
    /// <typeparam name="T1">The first argument type.</typeparam>
    /// <typeparam name="T2">The second argument type.</typeparam>
    /// <typeparam name="T3">The third argument type.</typeparam>
    public delegate TResult AsyncProcessDelegate<T1, T2, T3, TResult>(AsyncProcessHelper helper, T1 arg1, T2 arg2, T3 arg3);

    /// <summary>
    /// Asynchronous process delegate.
    /// </summary>
    /// <param name="helper">The async process helper.</param>
    /// <param name="arg1">The first method argument.</param>
    /// <param name="arg2">The second method argument.</param>
    /// <typeparam name="TResult">The result object type.</typeparam>
    /// <typeparam name="T1">The first argument type.</typeparam>
    /// <typeparam name="T2">The second argument type.</typeparam>
    public delegate TResult AsyncProcessDelegate<T1, T2, TResult>(AsyncProcessHelper helper, T1 arg1, T2 arg2);

    /// <summary>
    /// Asynchronous process delegate.
    /// </summary>
    /// <param name="helper">The async process helper.</param>
    /// <param name="arg">The method argument.</param>
    /// <typeparam name="TResult">The result object type.</typeparam>
    /// <typeparam name="T1">The argument type.</typeparam>
    public delegate TResult AsyncProcessDelegate<T1, TResult>(AsyncProcessHelper helper, T1 arg);

    /// <summary>
    /// Asynchronous process delegate.
    /// </summary>
    /// <param name="helper">The async process helper.</param>
    /// <typeparam name="TResult">The result object type.</typeparam>
    public delegate TResult AsyncProcessDelegate<TResult>(AsyncProcessHelper helper);
}